﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using TCC.ControleFluxoDeCaixa.Model.Contas;
using TCC.ControleFluxoDeCaixa.Model.Entities;
using TCC.ControleFluxoDeCaixa.Model.Fluxo;
using TCC.ControleFluxoDeCaixa.Model.Usuarios;

namespace TCC.ControleFluxoDeCaixa.Model.Gerenciadores
{
    public class GerenciadorDeSaldo
    {
        private static GerenciadorDeSaldo _singletonInsance;

        public decimal CalculaSaldoDaConta(FluxoDeCaixaContextFiltrado context)
        {
            return CalculaSaldoDaConta(context, context.ContaFinanceiras);
        }

        public decimal CalculaSaldoDaConta(FluxoDeCaixaContextFiltrado context, ContaFinanceira contaFinanceira, DateTime? dataSaldo = null)
        {
            return CalculaSaldoDaConta(context, new[] { contaFinanceira }, dataSaldo);
        
        }
        
        public decimal CalculaSaldoDaConta(FluxoDeCaixaContextFiltrado context, IEnumerable<ContaFinanceira> contaFinanceira, DateTime? dataSaldo = null)
        {
            var ids = contaFinanceira.Select(c => c.ContaFinanceiraId).ToArray();
            var movimentos = context.Movimentos.Where(c => ids.Contains(c.Conta.ContaFinanceiraId));


            if (dataSaldo.HasValue)
            {
                dataSaldo = dataSaldo.Value.AddDays(1).Date;
                movimentos = movimentos.Where(m => m.DataDoMovimento < dataSaldo);
            }

            return movimentos.Sum(m => (decimal?)((int)m.TipoDeMovimento) * m.ValorAbsoluto) ?? 0;
        }

        static GerenciadorDeSaldo()
        {
            _singletonInsance = new GerenciadorDeSaldo();
        }
        public static GerenciadorDeSaldo GetInstance()
        {
            return _singletonInsance;
        }
        
    }
}
